package net.tatu.service.impl;

import java.math.BigDecimal;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import net.tatu.dao.OrgBusinessTargetRelaMapper;
import net.tatu.dao.PubCodeMapper;
import net.tatu.dao.SysLogMapper;
import net.tatu.dao.UserLevelRangeDefineMapper;
import net.tatu.dao.UserMapper;
import net.tatu.dao.UserPremAccountMapper;
import net.tatu.dao.UserPremDetailMapper;
import net.tatu.model.OrgBusinessTargetRela;
import net.tatu.model.PubCode;
import net.tatu.model.SysLog;
import net.tatu.model.User;
import net.tatu.model.UserLevelRangeDefine;
import net.tatu.model.UserPremAccount;
import net.tatu.model.UserPremDetail;
import net.tatu.service.OrgBusinessTargetRelaService;
import net.tatu.service.PubCodeService;
import net.tatu.service.SysLogService;
import net.tatu.service.UserPremAccountService;
import net.tatu.service.UserService;
import net.tatu.util.Encrypt;
import net.tatu.util.Util;

@Service
public class UserPremAccountServiceImpl implements UserPremAccountService {
	Logger log = Logger.getLogger(UserPremAccountServiceImpl.class);
	@Autowired
	private UserPremAccountMapper userPremAccountMapper;
	@Autowired
	private UserPremDetailMapper userPremDetailMapper;
	@Autowired
	private UserLevelRangeDefineMapper userLevelRangeDefineMapper;
	@Autowired
	private UserService userService;
	@Autowired
	private SysLogService sysLogService;
	@Override
	public UserPremAccount getUserPremAccount(
			UserPremAccount userPremAccount) {
		log.debug("得到UPA");
		UserPremAccount upa = userPremAccountMapper.getUserPremAccount(userPremAccount);
		log.debug("更新UPA");
		updateUserPremAccount(upa);
		log.debug("完成UPA");
		return upa;
	}
	@Override
	public boolean checkUserPremAccount(User user) {
		boolean ret = false;
		UserPremAccount u = new UserPremAccount();
		u.setUserPremActId(user.getUserId());
		UserPremAccount u2 = userPremAccountMapper.getUserPremAccount(u);
		if(u2 != null){
			ret = true;
		}else{
			ret = false;
		}
		return ret;
	}
	@Override
	public boolean createUserPremAccount(User user) {
		boolean ret = false;
		UserPremAccount u = new UserPremAccount();
		u.setUserPremActId(user.getUserId());
		u.setRecordStatusCode(1);
		int i = userPremAccountMapper.insertUserPremAccount(u);
		if(i == 1){
			ret = true;
		}else{
			log.error("用户创建新的资金账户失败！");
		}
		return ret;
	}
	@Override
	public int updateUserPremAccount(UserPremAccount userPremAccount) {
		int i = userPremAccountMapper.updateUserPremAccount(userPremAccount);

		return i;
	}
	@Override
	public int updateUserLevel(User user) {
		int level = user.getUserLevelCode();
		//获取用户资金账户
		UserPremAccount userPremAccount = new UserPremAccount();
		userPremAccount.setUserPremActId(user.getUserId());
		UserPremAccount upa = userPremAccountMapper.getUserPremAccount(userPremAccount);
		//获取用户资金流水信息
		UserPremDetail userPremDetail = new UserPremDetail();
		userPremDetail.setUserPremActId(upa.getUserPremActId());
		List<UserPremDetail> details = userPremDetailMapper.getUserPremDetail(userPremDetail);
		log.debug("details.size:" + details.size());
		BigDecimal sum = upa.getUserPremActPrem() == null ? new BigDecimal(0) : new BigDecimal(upa.getUserPremActPrem());
		BigDecimal detail = new BigDecimal(0);
		for(int j = 0; j < details.size(); j++){
			
			UserPremDetail u = details.get(j);
			log.debug("detail changeTYpe Code:" + u.getChangeTypeCode() + " changePrem:" + u.getChangePrem() );
			if(u.getChangeTypeCode() == 110005 || u.getChangeTypeCode() == 110006){
				log.debug("detail changeTYpe Code:" + u.getChangeTypeCode() + " changePrem:" + u.getChangePrem() + detail);
				detail = detail.add(new BigDecimal(u.getChangePrem()));
			}
		}
//		log.debug("sum:" + sum.doubleValue() +  "  detail:" + detail.doubleValue());
		sum = sum.add(detail);
		int userKind = user.getUserKindCode();
		List<UserLevelRangeDefine> levels = userLevelRangeDefineMapper.getUserLevelRangeDefine(null);
		log.debug("levels:" + levels.size());
		for(int i = 0; i < levels.size(); i++){
			UserLevelRangeDefine ulrd = levels.get(i);
			if(ulrd.getUserKindCode() == userKind){
				if(sum.subtract(new BigDecimal(ulrd.getMinPoint())).doubleValue() > 0 && sum.subtract(new BigDecimal(ulrd.getMaxPoint())).doubleValue() < 0){
					level = Integer.valueOf(String.valueOf(ulrd.getUserLevelCode()));
				}
			}
		}
		log.debug("得到新的用户level：" + level);
		user.setUserLevelCode(level);
		userService.updateUser(user);
		return 0;
	}
	@Override
	public boolean newPremDetail(long userPremActId, int changePrem, int changeTypeCode, int premChangeStatusCode){
		boolean ret = false;
		UserPremDetail userPremDetail = new UserPremDetail();
		userPremDetail.setUserPremActId(userPremActId);
		userPremDetail.setChangePrem(Double.valueOf(changePrem));
		userPremDetail.setRecordStatusCode(1);
		userPremDetail.setChangeTypeCode(changeTypeCode);
		userPremDetail.setPremChangeStatusCode(premChangeStatusCode);
//		userPremDetail.setProjectSplitId(projectSplitId);
		int i = userPremDetailMapper.insertUserPremDetail(userPremDetail);
		if(i == 1){
			ret = true;
		}
		return ret;
	}
	@Override
	public List<UserPremDetail> getUserPremDetail(UserPremDetail userPremDetail) {
		List<UserPremDetail> list = userPremDetailMapper.getUserPremDetail(userPremDetail);
		return list;
	}
	@Override
	public boolean withdraw(User u, String sum, String bankCardNo) {
		boolean ret = false;
		UserPremAccount userPremAccount = new UserPremAccount();
		userPremAccount.setUserPremActId(u.getUserId());
		UserPremAccount upa = userPremAccountMapper.getUserPremAccount(userPremAccount);
		if(upa != null){
			upa.setUserPremActPrem(new BigDecimal(upa.getUserPremActPrem()).subtract(new BigDecimal(sum)).doubleValue());
			upa.setUserPremActAvailablePrem(new BigDecimal(upa.getUserPremActAvailablePrem()).subtract(new BigDecimal(sum)).doubleValue());
			int i = updateUserPremAccount(upa);
			//资金操作日志
			boolean b1 = newPremDetail(u.getUserId(), Integer.valueOf(sum), 110002, 113002);
			//程序日志记录
//			sysLogService.newLog(logTypeCode, eventStatusCode, logKindCode, objectId)；问题，logTypeCode
			ret = b1;
		}
		return ret;
	}
	
}
